home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / thcalc / thcalc.c next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  2.1 KB  |  126 lines

  1.  
  2. /*
  3.     “THcalc”簡易計算機
  4.  
  5.         By 五味(93/01/15 ~)
  6.  
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12.  
  13. #define    ENZ    4        /* 総演算子数    */
  14. #define    FULL    (char *)0xffff    /* フルポインタ    */
  15. #define    ENZN    0xff        /* ヌル演算子    */
  16.  
  17.     char    *mark[]={ "*","/","+","-"    };
  18.                 /* 演算子一覧    */
  19.  
  20.  
  21.  
  22. int expr(char *siki,int enz)    /* 演算本体    */
  23. {
  24.     static int    i;        /* 汎用(ループ等)    */
  25.     auto char    *p;        /* 汎用ポインタ        */
  26.     auto int    enzk;        /* 掛かっている演算子    */
  27.     auto int    val,tval;    /* 一時的な値        */
  28.     auto char    *lesp,*tmp;    /* 演算子のポインタ    */
  29.  
  30.  
  31.     for( ; *siki=='\t' || *siki==' ' ; siki++ );    /* 値の先頭へ移動 */
  32.  
  33.  
  34.     if( *siki=='(' )                /* 演算元の算出    */
  35.         {
  36.         for( i=1,p=(++siki) ; i!=0 && *p!='\0' ; p++ )
  37.             if( *p=='(' )
  38.                 i++;
  39.             else
  40.             if( *p==')' )
  41.                 i--;
  42.         if( i )
  43.             {
  44.             printf("   括弧が異常です.\n");
  45.             exit(1);
  46.             }
  47.         else
  48.             *(p-1)='\0';
  49.  
  50.         tval = expr(siki,ENZN);
  51.         siki = p;
  52.         }                    /* 括弧内    */
  53.     else
  54.         tval=atoi(siki);            /* 定数        */
  55.  
  56.  
  57.  
  58.     for( i=0,enzk=ENZN,lesp=FULL ; i<ENZ ; i++ )
  59.         if( (tmp=strstr(siki,mark[i]))!=NULL && tmp<lesp )
  60.             {
  61.             lesp=tmp;
  62.             enzk=i;
  63.             }        /* 後ろの演算子を割り出す    */
  64.  
  65.  
  66.     if( enzk<=enz && enzk!=ENZN )        /* 演算子ごとの演算    */
  67.         {
  68.         val = expr(lesp+strlen(mark[enzk]),enzk);
  69.  
  70.         switch(enzk)
  71.             {
  72.         case 0:
  73.             val = tval * val;
  74.             break;
  75.         case 1:
  76.             val = tval / val;
  77.             break;
  78.         case 2:
  79.             val = tval + val;
  80.             break;
  81.         case 3:
  82.             val = tval - val;
  83.             break;
  84.             }
  85.         }
  86.     else
  87.         val = tval;
  88.  
  89.  
  90.     return(val);        /* 演算後の値を返却    */
  91. }
  92.  
  93.  
  94.  
  95.  
  96. int main(int argc,char *argv[])
  97. {
  98.  
  99.     char    str[128];    /* 式複写用バッファ    */
  100.  
  101.     if( argc!=2 )
  102.         {
  103.         printf("\n");
  104.         printf("   “THcalc”簡易計算機 V1.1\n");
  105.         printf("   (c) Hisashi Gomi  93/01/15 \n\n");
  106.  
  107.         if( argc>2 )
  108.             {
  109.             printf("   式には空白を挟めません.\n");
  110.             return(2);
  111.             }
  112.         else
  113.             {
  114.             printf("   [使い方] THcalc <式>\n");
  115.             return(0);
  116.             }
  117.  
  118.         }
  119.  
  120.  
  121.     strcpy(str,argv[1]);    /* expr()が文字列を破壊するため    */
  122.     printf("\n   %s = %d\n",argv[1],expr(str,ENZN) );
  123.  
  124.     return(0);
  125. }
  126.